import java.util.*;
import java.io.*;
import org.eclipse.swt.widgets.Display;

public abstract class DirWatcher extends TimerTask {
	private String path;
	private int deltaTime;
	private File filesArray [];
	private HashMap<File,Long> dir = new HashMap<File,Long>();
	Display display;
	
	public DirWatcher(String path, int deltaTime,Display display) {
		this.path = path;
		this.deltaTime=deltaTime;
		this.display=display;
		filesArray = new File(path).listFiles();
		
	}

	public final void run() {
		
		//hash para guardar os elementos que foram verificados
		HashSet<File> checkedFiles = new HashSet<File>();
		
		//obter os ficheiros presentes na pasta
		filesArray = new File(path).listFiles();

		//pesquisa os ficheiros e verifica a modificacao e a criacao de novos ficheiros
		for(int i = 0; i < filesArray.length; i++) {
			Long current = (Long)dir.get(filesArray[i]);
			checkedFiles.add(filesArray[i]);
			//se nao existir
			if (current == null) {
				// new file
				//nao permitir o ficheiros que comecem com ponto
				if(filesArray[i].isFile() && filesArray[i].getName().indexOf('.')!=0 ){
					dir.put(filesArray[i], new Long(filesArray[i].lastModified()));
					onChange(filesArray[i], "add");
				}
			}
			//caso o lastmodified seja diferente
			else if (current.longValue() != filesArray[i].lastModified()){
				// modified file
				if(filesArray[i].isFile()){
					dir.put(filesArray[i], new Long(filesArray[i].lastModified()));
					onChange(filesArray[i], "modify");
				}
			}
		}

		//verifica se algum ficheiro foi eliminado
		//cria um conj com os ficheiros existentes no dir
		Set<File> ref = ((HashMap<File,Long>)dir.clone()).keySet();
		//remove os ficheiros verificados anteriormente
		ref.removeAll((Set<File>)checkedFiles);
		Iterator<File> it = ref.iterator();
		//ficheiros eliminados
		while (it.hasNext()) {
			File deletedFile = (File)it.next();
			dir.remove(deletedFile);
			onChange(deletedFile, "delete");
		}
		display.timerExec(deltaTime, this);
	}
	protected abstract void onChange( File file, String action );
}
